package codingforgreat.class19;


//lc : lcr 162
public class Class03_OneNumber {
    public static int solution1(int num) {
        if (num < 1) {
            return 0;
        }
        int count = 0;
        for (int i = 1; i != num + 1; i++) {
            count += get1Nums(i);
        }
        return count;
    }

    public static int get1Nums(int num) {
        int res = 0;
        while (num != 0) {
            if (num % 10 == 1) {
                res++;
            }
            num /= 10;
        }
        return res;
    }

    public static int countDigitOne(int num) {
        if (num < 1) {
            return 0;
        }
        // num -> 13625
        // len = 5位数
        int len = getLenOfNum(num);
        if(len == 1){
            return 1;
        }
        // num 13625
        // tmp1 10000
        //
        // num 7872328738273
        // tmp1 1000000000000
        int  tmp1 = powerBase10(len - 1);
        //最高位
        int first = num / tmp1;
        // 最高1 N % tmp1 + 1
        // 最高位first tmp1
        int firstOne = first == 1 ? num %  tmp1 + 1 : tmp1;
        // 除去最高位之外，剩下1的数量
        // 最高位1 10(k-2次方) * (k-1) * 1
        // 最高位first 10(k-2次方) * (k-1) * first
        int otherOne = first * (len - 1) * (tmp1 / 10);
        return firstOne + otherOne + countDigitOne(num - tmp1);
    }
    public static int getLenOfNum(int num) {
        int len = 0;
        while(num != 0){
            len++;
            num /= 10;
        }
        return len;
    }
    public static int powerBase10(int num) {
        return (int) Math.pow(10, num);
    }


}
